### USER
Полная подробная пошаговая инструкция установки vm mailcow ip 192.168.1.5 c доменов rummail.ru в proxmox подключенный через роутер keenetic с белым ip 185.77.204.18 с использованием установленного сервера Nginx Proxy Manager ip 192.168.1.2 и настройкой автоматического копирования SSL-ключей /opt/npm/letsencrypt/live/npm-3/fullchain.pem , /opt/npm/letsencrypt/live/npm-3/privkey.pem и обновления через cron и пробросом портов для почты

### ASSISTANT
# 🐮 Полная инструкция: Установка Mailcow в Proxmox с Nginx Proxy Manager

---

## 📋 Исходные данные

| Параметр | Значение |
|---|---|
| Гипервизор | Proxmox VE |
| VM Mailcow | IP `192.168.1.5` |
| Домен почты | `rummail.ru` |
| Роутер | Keenetic, белый IP `185.77.204.18` |
| NPM (обратный прокси) | IP `192.168.1.2`, установлен |
| SSL-сертификаты NPM | `/opt/npm/letsencrypt/live/npm-3/fullchain.pem` и `privkey.pem` |

---

## ⚠️ Этап 0. DNS — настройка до начала установки

Перед установкой Mailcow DNS-записи домена `rummail.ru` должны быть настроены и указывать на белый IP `185.77.204.18`. Создайте на DNS-хостинге (у регистратора домена) следующие записи:

```
Тип A:
  rummail.ru.              → 185.77.204.18
  mail.rummail.ru.         → 185.77.204.18
  autodiscover.rummail.ru. → 185.77.204.18
  autoconfig.rummail.ru.   → 185.77.204.18

Тип MX:
  rummail.ru.  MX 10 mail.rummail.ru.

Тип TXT (SPF):
  rummail.ru.  TXT "v=spf1 mx a ~all"

Тип TXT (_dmarc):
  _dmarc.rummail.ru.  TXT "v=DMARC1; p=quarantine; rua=mailto:admin@rummail.ru"
```

> ⚠️ **Важно:** DNS-записи должны «разойтись» (от 1 до 24 часов). Начинайте установку когда `mail.rummail.ru` уже пингуется как `185.77.204.18`.

---

## 🖥️ Этап 1. Создание виртуальной машины в Proxmox

### 1.1. Загрузите образ Debian 12 (Bookworm)

```bash
# На хосте Proxmox, через Shell:
cd /var/lib/vz/template/iso
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.x.x-amd64-netinst.iso
```

### 1.2. Создайте VM через GUI Proxmox

| Параметр | Значение |
|---|---|
| **Name** | `mailcow` |
| **OS** | Debian 12 |
| **CPU** | 4 ядра (минимум 2) |
| **RAM** | 6–8 GB (минимум 4 GB) |
| **Disk** | 40+ GB (рекомендую 60 GB, thin provision) |
| **Network** | `vmbr0`, мост на физический интерфейс |

### 1.3. Установите Debian

При установке ОС на VM:
- **Hostname:** `mail`
- **Domain:** `rummail.ru` (полный FQDN = `mail.rummail.ru`)
- **Сетевые настройки — Static IP:**

```
IP address:  192.168.1.5/24
Gateway:     192.168.1.1   (IP роутера Keenetic)
DNS:         192.168.1.1   (или 8.8.8.8, 1.1.1.1)
```

- **Пользователь:** создайте `root` с паролем (или пользователя с sudo)
- **Программное обеспечение:** выберите **SSH server** и **Standard system utilities**
- **Рабочее окружение:** **НЕ** устанавливайте (снимите все галочки DE)

---

## 🌐 Этап 2. Базовая настройка ОС

Зайдите в VM по SSH или через консоль Proxmox:

```bash
# 2.1. Обновление пакетов
apt update && apt upgrade -y

# 2.2. Установите необходимые утилиты
apt install -y curl wget git vim htop net-tools ca-certificates gnupg lsb-release

# 2.3. Проверьте hostname (ОБЯЗАТЕЛЬНО FQDN!)
hostname
# Должно быть: mail.rummail.ru

hostname -f
# Должно быть: mail.rummail.ru

# 2.4. Если hostname не FQDN — исправьте:
hostnamectl set-hostname mail.rummail.ru

# 2.5. Проверьте /etc/hosts
cat /etc/hosts
```

Файл `/etc/hosts` должен выглядеть так:

```
127.0.0.1       localhost
192.168.1.5     mail.rummail.ru mail

# Строка IPv6 (если есть) — закомментируйте или удалите:
#::1            localhost ip6-localhost ip6-loopback
```

Исправьте если нужно:

```bash
cat > /etc/hosts << 'EOF'
127.0.0.1       localhost
192.168.1.5     mail.rummail.ru mail
EOF
```

### 2.6. Проверка сети

```bash
ping -c 3 192.168.1.1     # шлюз (Keenetic)
ping -c 3 8.8.8.8          # интернет
ping -c 3 mail.rummail.ru  # свой FQDN
```

---

## 🐳 Этап 3. Установка Docker и Docker Compose

```bash
# 3.1. Удалите старые версии (если есть)
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do
  apt remove -y $pkg 2>/dev/null
done

# 3.2. Добавьте официальный репозиторий Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
  gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/debian $(lsb_release -cs) stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

# 3.3. Установите Docker
apt update && apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

# 3.4. Проверка
docker --version
docker compose version

# 3.5. Автозапуск Docker
systemctl enable docker --now
```

---

## 🐮 Этап 4. Клонирование и конфигурация Mailcow

```bash
# 4.1. Клонируйте репозиторий
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

# 4.2. Сгенерируйте конфигурацию
./generate_config.sh
```

При запросе укажите:

```
Enter mail server hostname (FQDN): mail.rummail.ru
Timezone [Europe/Berlin]: Europe/Moscow
```

> После этого создастся файл `mailcow.conf`.

### 4.3. Отредактируйте `mailcow.conf`

```bash
nano mailcow.conf
```

**Ключевые строки — приведите к такому виду:**

```ini
MAILCOW_HOSTNAME=mail.rummail.ru
TIMEZONE=Europe/Moscow

# --- Не использовать встроенный SSL от Mailcow (будем брать из NPM) ---
SKIP_LETS_ENCRYPT=y

# --- Эти строки ОСТАВЬТЕ закомментированными (не используем ACME) ---
#HTTP_BIND=
#HTTPS_BIND=
#HTTP_PORT=80
#HTTPS_PORT=443

# --- SNAT (для правильного исходящего IP) ---
# Если почтовый сервер должен слать с белого IP — оставьте как есть,
# Internet-bound трафик пойдёт через шлюз Keenetic с белым IP.
SNAT_TO_SOURCE=

# --- Дополнительные порты — стандартные ---
# (убедитесь что эти строки не закомментированы)
HTTP_PORT=80
HTTP_BIND=0.0.0.0
HTTPS_PORT=443
HTTPS_BIND=0.0.0.0
```

Сохраните: `Ctrl+O`, `Enter`, `Ctrl+X`.

---

## 🔌 Этап 5. Проброс портов на роутере Keenetic

Зайдите в веб-интерфейс Keenetic (обычно `192.168.1.1`).

### 5.1. Раздел: **Сетевые правила → Переадресация портов**

Создайте следующие правила проброса с **белого IP `185.77.204.18`** на **`192.168.1.5`** (VM Mailcow):

| Протокол | Внешний порт | Внутр. IP | Внутр. порт | Назначение |
|---|---|---|---|---|
| TCP | **25** | 192.168.1.5 | 25 | SMTP (входящая почта) |
| TCP | **465** | 192.168.1.5 | 465 | SMTPS (отправка с SSL) |
| TCP | **587** | 192.168.1.5 | 587 | Submission (отправка клиентами) |
| TCP | **993** | 192.168.1.5 | 993 | IMAPS (забор почты) |
| TCP | **995** | 192.168.1.5 | 995 | POP3S (если нужно) |
| TCP | **143** | 192.168.1.5 | 143 | IMAP (если нужно) |
| TCP | **110** | 192.168.1.5 | 110 | POP3 (если нужно) |
| TCP | **80** | 192.168.1.2 | 80 | HTTP (на NPM) |
| TCP | **443** | 192.168.1.2 | 443 | HTTPS (на NPM) |

> ⚠️ **Важно:** порты **80** и **443** пробрасываются на **NPM** (`192.168.1.2`), а не напрямую на Mailcow! Почтовые порты — напрямую на Mailcow (`192.168.1.5`).

### 5.2. Сохраните и примените правила. Перезагрузите роутер при необходимости.

---

## 🌍 Этап 6. Настройка Nginx Proxy Manager (NPM)

Зайдите в веб-интерфейс NPM: `http://192.168.1.2:81`

### 6.1. SSL-сертификат для `mail.rummail.ru`

Перейдите в **SSL Certificates → Add Let's Encrypt Certificate**:

- **Domain Names:** `mail.rummail.ru`, `autodiscover.rummail.ru`, `autoconfig.rummail.ru`
- **Email:** `admin@rummail.ru`
- **Use a DNS Challenge:** **НЕТ** (используем HTTP Challenge)
- Нажмите **Save**

> Убедитесь, что сертификат выпущен успешно (статус: Active).  
> После выпуска он будет лежать в `/opt/npm/letsencrypt/live/npm-3/` (номер может отличаться — проверьте!).

### 6.2. Proxy Host для Mailcow

**Hosts → Add Proxy Host:**

| Поле | Значение |
|---|---|
| **Domain Names** | `mail.rummail.ru` |
| **Scheme** | `http` |
| **Forward Hostname/IP** | `192.168.1.5` |
| **Forward Port** | `80` |
| **Block Common Exploits** | ✅ |
| **Websocket Support** | ✅ |

Вкладка **SSL**:
- **SSL Certificate:** выберите созданный ранее сертификат (`mail.rummail.ru`)
- **Force SSL:** ✅
- **HTTP/2 Support:** ✅

### 6.3. (Опционально) Proxy для autodiscover/autoconfig

Создайте ещё один Proxy Host:

| Поле | Значение |
|---|---|
| **Domain Names** | `autodiscover.rummail.ru`, `autoconfig.rummail.ru` |
| **Scheme** | `http` |
| **Forward Hostname/IP** | `192.168.1.5` |
| **Forward Port** | `80` |
| **SSL** | тот же сертификат, Force SSL ✅ |

---

## 🔐 Этап 7. Копирование SSL-сертификатов из NPM в Mailcow

> Mailcow ожидает сертификаты по пути `/opt/mailcow-dockerized/data/assets/ssl/`  
> Мы будем автоматически копировать их из NPM.

### 7.1. Определите точный путь сертификата в NPM

```bash
# На сервере NPM (192.168.1.2):
ls -la /opt/npm/letsencrypt/live/
# Вы увидите папки: npm-1, npm-2, npm-3, ...
# Найдите ту, которая соответствует mail.rummail.ru:

cat /opt/npm/letsencrypt/live/npm-*/cert.pem | openssl x509 -noout -text | grep -A1 "Subject:"
# Или проще — проверьте символические ссылки внутри папок.
```

Допустим, это `npm-3` (как у вас в условии).

### 7.2. Настройка SSH-доступа между VM Mailcow и NPM

**На VM Mailcow (`192.168.1.5`):**

```bash
# Сгенерируйте SSH-ключ
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519

# Выведите публичный ключ — скопируйте его:
cat /root/.ssh/id_ed25519.pub
```

**На сервере NPM (`192.168.1.2`):**

```bash
# Добавьте публичный ключ Mailcow в authorized_keys
mkdir -p /root/.ssh
echo "СКОПИРОВАННЫЙ_ПУБЛИЧНЫЙ_КЛЮЧ" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
```

**Проверка (с Mailcow VM):**

```bash
ssh root@192.168.1.2 "echo OK"
# Должно ответить "OK" без пароля.
```

### 7.3. Создайте скрипт копирования сертификатов

**На VM Mailcow (`192.168.1.5`):**

```bash
nano /usr/local/bin/sync-mailcow-ssl.sh
```

Содержимое скрипта:

```bash
#!/bin/bash
#
# sync-mailcow-ssl.sh
# Копирует SSL-сертификаты из NPM (192.168.1.2) в Mailcow и перезагружает Dovecot/Postfix/Nginx.

set -e

NPM_HOST="192.168.1.2"
NPM_CERT_DIR="/opt/npm/letsencrypt/live/npm-3"          # ← проверьте номер папки!
MAILCOW_SSL_DIR="/opt/mailcow-dockerized/data/assets/ssl"

# Файлы для копирования
CERT_FILE="fullchain.pem"
KEY_FILE="privkey.pem"

# Куда кладём в Mailcow
CERT_DEST="${MAILCOW_SSL_DIR}/cert.pem"
KEY_DEST="${MAILCOW_SSL_DIR}/key.pem"

echo "[$(date)] Запуск синхронизации SSL-сертификатов..."

# Проверка доступности NPM
if ! ping -c 1 -W 2 ${NPM_HOST} > /dev/null 2>&1; then
    echo "[$(date)] ОШИБКА: сервер NPM ${NPM_HOST} недоступен."
    exit 1
fi

# Создаём временную папку
TMPDIR=$(mktemp -d)
trap "rm -rf ${TMPDIR}" EXIT

# Копируем сертификаты через SCP
scp -o StrictHostKeyChecking=accept-new -q \
    root@${NPM_HOST}:${NPM_CERT_DIR}/${CERT_FILE} \
    root@${NPM_HOST}:${NPM_CERT_DIR}/${KEY_FILE} \
    ${TMPDIR}/

# Проверяем, что файлы не пустые
if [ ! -s "${TMPDIR}/${CERT_FILE}" ] || [ ! -s "${TMPDIR}/${KEY_FILE}" ]; then
    echo "[$(date)] ОШИБКА: скопированные файлы пусты."
    exit 1
fi

# Проверяем валидность сертификата
if ! openssl x509 -in "${TMPDIR}/${CERT_FILE}" -noout -subject > /dev/null 2>&1; then
    echo "[$(date)] ОШИБКА: fullchain.pem не является валидным сертификатом."
    exit 1
fi

# Проверяем валидность ключа
if ! openssl rsa -in "${TMPDIR}/${KEY_FILE}" -check -noout > /dev/null 2>&1; then
    echo "[$(date)] ОШИБКА: privkey.pem не является валидным ключом."
    exit 1
fi

# Сравниваем с текущими (если есть) — пропускаем перезагрузку если не изменились
if [ -f "${CERT_DEST}" ] && [ -f "${KEY_DEST}" ]; then
    if cmp -s "${TMPDIR}/${CERT_FILE}" "${CERT_DEST}" && \
       cmp -s "${TMPDIR}/${KEY_FILE}" "${KEY_DEST}"; then
        echo "[$(date)] Сертификаты не изменились, пропускаем."
        exit 0
    fi
fi

# Копируем финально
cp "${TMPDIR}/${CERT_FILE}" "${CERT_DEST}"
cp "${TMPDIR}/${KEY_FILE}" "${KEY_DEST}"
chmod 644 "${CERT_DEST}"
chmod 600 "${KEY_DEST}"

echo "[$(date)] Сертификаты скопированы. Перезагружаем контейнеры..."

# Перезагрузка контейнеров Mailcow, использующих SSL
cd /opt/mailcow-dockerized
docker compose restart nginx-mailcow dovecot-mailcow postfix-mailcow

echo "[$(date)] Готово! Сертификаты обновлены."
```

Сделайте скрипт исполняемым:

```bash
chmod +x /usr/local/bin/sync-mailcow-ssl.sh
```

### 7.4. Запустите вручную для проверки

```bash
/usr/local/bin/sync-mailcow-ssl.sh
```

Убедитесь, что ошибок нет, и файлы появились:

```bash
ls -la /opt/mailcow-dockerized/data/assets/ssl/
# Должны быть: cert.pem и key.pem

openssl x509 -in /opt/mailcow-dockerized/data/assets/ssl/cert.pem -noout -subject -dates
# Должен показать Subject: CN = mail.rummail.ru и срок действия.
```

---

## ⏰ Этап 8. Настройка Cron для автоматического обновления SSL

Сертификаты Let's Encrypt живут **90 дней**. NPM обновляет их автоматически, но нам нужно после каждого обновления копировать в Mailcow.

### 8.1. На VM Mailcow: cron-задача на ежедневную синхронизацию

```bash
crontab -e
```

Добавьте строку (запуск каждый день в 04:00 и при перезагрузке):

```
# Синхронизация SSL-сертификатов из NPM в Mailcow
0 4 * * * /usr/local/bin/sync-mailcow-ssl.sh >> /var/log/mailcow-ssl-sync.log 2>&1
@reboot sleep 30 && /usr/local/bin/sync-mailcow-ssl.sh >> /var/log/mailcow-ssl-sync.log 2>&1
```

### 8.2. На сервере NPM: триггер после обновления сертифика
## 8.2. На сервере NPM: триггер после обновления сертификата

NPM автоматически обновляет сертификаты Let's Encrypt. Чтобы после обновления сразу запустить синхронизацию на Mailcow, настройте триггер на NPM.

**На сервере NPM (`192.168.1.2`):**

```bash
# Создайте скрипт-триггер
nano /usr/local/bin/trigger-mailcow-ssl-sync.sh
```

Содержимое:

```bash
#!/bin/bash
#
# Вызывается после обновления сертификата в NPM.
# Запускает синхронизацию на Mailcow по SSH.

MAILCOW_HOST="192.168.1.5"

echo "[$(date)] NPM: сертификат обновлён, запускаем синхронизацию на Mailcow..."

ssh -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10 \
    root@${MAILCOW_HOST} "/usr/local/bin/sync-mailcow-ssl.sh"

if [ $? -eq 0 ]; then
    echo "[$(date)] NPM: синхронизация SSL на Mailcow выполнена успешно."
else
    echo "[$(date)] NPM: ОШИБКА синхронизации SSL на Mailcow!" >&2
fi
```

```bash
chmod +x /usr/local/bin/trigger-mailcow-ssl-sync.sh
```

### 8.3. Подключите триггер к NPM

NPM хранит скрипты обновления в папке `/opt/npm/`. Создайте хук:

```bash
# На сервере NPM:
mkdir -p /opt/npm/renewal-hooks

nano /opt/npm/renewal-hooks/post-renew.sh
```

```bash
#!/bin/bash
# Post-renewal hook для NPM
/usr/local/bin/trigger-mailcow-ssl-sync.sh
```

```bash
chmod +x /opt/npm/renewal-hooks/post-renew.sh
```

Теперь добавьте вызов хука в cron NPM (если NPM не поддерживает нативные хуки):

```bash
crontab -e
```

```
# Проверка обновления сертификатов и синхронизация — раз в день
30 3 * * * /opt/npm/renewal-hooks/post-renew.sh >> /var/log/npm-ssl-hook.log 2>&1
```

> ℹ️ Если NPM использует свой планировщик для renew, этот cron будет просто «лишний раз» дёргать синхронизацию. Это безопасно: скрипт `sync-mailcow-ssl.sh` сам проверяет, изменились ли файлы, и пропускает перезагрузку если нет.

---

## 🚀 Этап 9. Запуск Mailcow

```bash
# На VM Mailcow (192.168.1.5):
cd /opt/mailcow-dockerized

# Запустите все контейнеры
docker compose pull   # скачать свежие образы
docker compose up -d  # запустить в фоне
```

Первичный запуск занимает 2–5 минут. Проверяйте логи:

```bash
docker compose logs -f --tail=50
```

Дождитесь, когда все контейнеры станут `healthy`:

```bash
docker compose ps
```

Все контейнеры должны быть в статусе `Up` и `healthy`.

---

## 🔐 Этап 10. Первый вход в админку Mailcow

Откройте браузер: **`https://mail.rummail.ru`**

Первый вход:
- **Логин:** `admin`
- **Пароль:** `moohoo` (пароль по умолчанию)

> ⚠️ **Сразу же смените пароль администратора!**  
> Перейдите: `Configuration → Mailboxes → Administrator → Edit → Password`.

---

## 📨 Этап 11. Настройка DKIM

DKIM-запись нужна, чтобы почта не попадала в спам.

### 11.1. Сгенерируйте DKIM в Mailcow

В админке Mailcow: **`Configuration → ARC/DKIM`**.

Напротив домена `rummail.ru` нажмите **«Generate»** (или импортируйте существующий ключ).

После генерации вы увидите DKIM-запись вида:

```
dkim._domainkey.rummail.ru.  TXT  "v=DKIM1;k=rsa;t=s;s=email;p=MIGfMA0G..."
```

### 11.2. Добавьте DKIM в DNS

Скопируйте всю строку и добавьте TXT-запись на DNS-хостинге домена `rummail.ru`:

```
Тип TXT:
  dkim._domainkey.rummail.ru.  TXT  "v=DKIM1;k=rsa;t=s;s=email;p=..."
```

### 11.3. Проверка DKIM

```bash
# Через 10–30 минут (после обновления DNS):
dig TXT dkim._domainkey.rummail.ru +short
```

---

## 🛡️ Этап 12. Настройка SPF и DMARC (финализация DNS)

Убедитесь, что все DNS-записи добавлены и разошлись:

```bash
# Проверка A-записей
dig A mail.rummail.ru +short         # → 185.77.204.18
dig A autodiscover.rummail.ru +short # → 185.77.204.18
dig A autoconfig.rummail.ru +short   # → 185.77.204.18

# Проверка MX
dig MX rummail.ru +short             # → 10 mail.rummail.ru.

# Проверка SPF
dig TXT rummail.ru +short | grep spf # → v=spf1 mx a ~all

# Проверка DMARC
dig TXT _dmarc.rummail.ru +short     # → v=DMARC1; p=quarantine; ...

# Проверка DKIM
dig TXT dkim._domainkey.rummail.ru +short  # → v=DKIM1; ...
```

---

## 🧪 Этап 13. Тестирование почтового сервера

### 13.1. Проверка портов извне

С **внешнего** сервера (или через сервис [portchecker.co](https://portchecker.co)) проверьте порты:

```bash
# Если есть внешний сервер — через telnet/nc:
nc -zv 185.77.204.18 25
nc -zv 185.77.204.18 587
nc -zv 185.77.204.18 993
nc -zv 185.77.204.18 443
```

### 13.2. Онлайн-тесты

| Сервис | URL |
|---|---|
| **MXToolbox** | https://mxtoolbox.com → введите `rummail.ru` |
| **Mail Tester** | https://www.mail-tester.com |
| **DKIMValidator** | https://dkimvalidator.com |
| **Internet.nl** | https://internet.nl/mail/ |

### 13.3. Отправка тестового письма

Через админку Mailcow → вкладка **Mailboxes** → создайте почтовый ящик (например `test@rummail.ru`).  
Затем зайдите в webmail: `https://mail.rummail.ru/SOGo/` и отправьте тестовое письмо на внешний адрес (Gmail, Yandex).

---

## 💾 Этап 14. Резервное копирование

### 14.1. Встроенный скрипт Mailcow

```bash
# На VM Mailcow:
cd /opt/mailcow-dockerized

# Создайте папку для бэкапов
mkdir -p /opt/backups/mailcow

# Ручной запуск бэкапа
./helper-scripts/backup_and_restore.sh backup all

# Бэкап сохранится в /opt/backups/mailcow/
```

### 14.2. Автоматический бэкап через cron

```bash
crontab -e
```

```
# Еженочный бэкап Mailcow в 02:00
0 2 * * * cd /opt/mailcow-dockerized && ./helper-scripts/backup_and_restore.sh backup all >> /var/log/mailcow-backup.log 2>&1
```

---

## 🔧 Этап 15. Возможные проблемы и их решение

### ❌ Проблема 1: «Порты 80/443 уже заняты»

```bash
# Проверьте, что слушает порты:
ss -tlnp | grep -E ':80|:443'

# Если занято — освободите (например, остановите nginx на хосте):
systemctl stop nginx && systemctl disable nginx
```

### ❌ Проблема 2: Контейнеры не запускаются

```bash
cd /opt/mailcow-dockerized
docker compose down
docker compose up -d
docker compose logs -f   # смотрите ошибки
```

### ❌ Проблема 3: Сертификат на mail.rummail.ru недействителен

```bash
# Проверьте цепочку вручную:
/usr/local/bin/sync-mailcow-ssl.sh
# Смотрите лог:
cat /var/log/mailcow-ssl-sync.log
```

### ❌ Проблема 4: Письма уходят в спам

Проверьте:
- ✅ Все DNS-записи (A, MX, SPF, DKIM, DMARC) разошлись
- ✅ `PTR`-запись (reverse DNS) для `185.77.204.18` указывает на `mail.rummail.ru`  
  *(PTR настраивается у провайдера белого IP, не у регистратора домена!)*
- ✅ IP `185.77.204.18` не в чёрных списках (проверьте через MXToolbox)

### ❌ Проблема 5: Входящая почта не доходит

- Проверьте проброс порта **25** на Keenetic
- Проверьте, что `MX` запись указывает на `mail.rummail.ru`
- Проверьте, не блокирует ли провайдер порт 25 (некоторые ISP блокируют):
  ```bash
  # С внешнего хоста:
  telnet 185.77.204.18 25
  ```

---

## ✅ Итоговая схема

```
Интернет
   │
   ▼
185.77.204.18 (белый IP, Keenetic)
   │
   ├─── Порты 25,465,587,993,995,143,110 ────▶ 192.168.1.5 (Mailcow VM)
   │
   └─── Порты 80,443 ───────────────────────▶ 192.168.1.2 (NPM)
                                                  │
                                                  ├── mail.rummail.ru ──▶ 192.168.1.5:80
                                                  ├── autodiscover ────▶ 192.168.1.5:80
                                                  └── SSL (LE cert) ──▶ копируется в Mailcow
```

| Компонент | IP | Роль |
|---|---|---|
| Keenetic | `185.77.204.18` / `192.168.1.1` | Шлюз, проброс портов |
| NPM | `192.168.1.2` | Обратный прокси, SSL, Let's Encrypt |
| Mailcow VM | `192.168.1.5` | Почтовый сервер (Docker) |

---

## 📝 Чек-лист (краткий)

- [ ] DNS-записи A, MX, SPF, DMARC, DKIM разошлись
- [ ] Debian 12 установлен, hostname = `mail.rummail.ru`
- [ ] Docker + Docker Compose установлены
- [ ] Mailcow склонирован, `mailcow.conf` настроен (`SKIP_LETS_ENCRYPT=y`)
- [ ] Порты проброшены на Keenetic
- [ ] NPM: выпущен LE-сертификат для `mail.rummail.ru`
- [ ] NPM: создан Proxy Host `mail.rummail.ru → 192.168.1.5:80`
- [ ] SSH-ключи: Mailcow → NPM (беспарольный доступ)
- [ ] `sync-mailcow-ssl.sh` создан, протестирован вручную
- [ ] Cron на Mailcow: ежедневная синхронизация SSL
- [ ] Триггер на NPM: после обновления сертификата
- [ ] Mailcow запущен (`docker compose up -d`)
- [ ] Админка открывается: `https://mail.rummail.ru`
- [ ] Пароль администратора сменён
- [ ] Почтовый ящик создан, тестовое письмо отправлено
- [ ] Настроен автоматический бэкап

---

**Готово!** 🎉 Ваш почтовый сервер Mailcow на Proxmox с SSL от Nginx Proxy Manager полностью настроен и работает.